package chapter_05;

// 程序控制语句

/*
1. 选择语句
    A. if-else if-else
    略

    B. switch
    switch (expression) {
    case value1:
    // statement sequence
    break;
    case value2:
    // statement sequence
    break;
    .
    .
    .
    case valueN:
    // statement sequence
    break;
    default:
    // default statement sequence
    }
    表达式expression必须为byte，short，int或char类型。每个case语句后的值value必须是与表达式类型兼容的特
    定的一个常量（它必须为一个常量，而不是变量）。重复的case值是不允许的。
    switch语句是可以嵌套的。

2. 循环语句
    A. while
    while(condition) {
        // body of loop
    }

    B. do-while循环
    do {
        // body of loop
    } while (condition);

    C. for循环
    for(initialization; condition; iteration) {
        // body
    }
    注意：如果你对C/C++熟悉，你就会知道逗号是一个运算符，能在任何有效的表达
    式中使用。然而，在Java 中不是这样。在 Java中，逗号仅仅是一个分隔符，只
    适用于for循环。

3. 跳转语句
    A. break
    break语句除了在switch语句和循环中使用之外，它还能作为goto 语句的一种“文明”
    形式来使用。Java中没有 goto语句，因为goto语句提供了一种改变程序运行流程的非结构
    化方式。这通常使程序难以理解和难于维护。它也阻止了某些编译器的优化。但是，有些
    地方goto语句对于构造流程控制是有用的而且是合法的。例如，从嵌套很深的循环中退出
    时， goto语句就很有帮助。因此，Java定义了break语句的一种扩展形式来处理这种情况。
    通过使用这种形式的break，你可以终止一个或者几个代码块。这些代码块不必是一个循环
    或一个switch语句的一部分，它们可以是任何的块。而且，由于这种形式的break语句带有
    标签，你可以明确指定执行从何处重新开始。你将看到，break带给你的是goto的益处，并
    舍弃了goto语句带来的麻烦。
    标签break语句的通用格式如下所示：
    break label;
    这里，标签label是标识代码块的标签。当这种形式的break执行时，控制被传递出指定
    的代码块。被加标签的代码块必须包围break语句，但是它不需要是直接的包围break的块。
    这意味着你可以使用一个加标签的break语句退出一系列的嵌套块。但是你不能使用break
    语句将控制传递到不包含break语句的代码块。
    要指定一个代码块，在其开头加一个标签即可。标签（label）可以是任何合法有效的
    Java标识符后跟一个冒号。一旦你给一个块加上标签后，你就可以使用这个标签作为break
    语句的对象了。这样做会使执行在加标签的块的结尾重新开始。

    B. continue
    略。

    C. return语句
    略。
 */

public class chapter_05 {

    public static void break1() {
        // 记住如果一个标签不在包围break的块中定义，你就不能break到该标签。
        boolean t = true;
        first: {
            second: {
                third: {
                    System.out.println("Before the break.");
                    if(t)
                        break second; // break out of second block
                    System.out.println("This won't execute");
                }
                System.out.println("This won't execute");
            }
            System.out.println("This is after second block.");
        }
    }

    public static void break2() {
        outer: for(int i=0; i<3; i++) {
            System.out.print("Pass " + i + ": ");
            for(int j=0; j<100; j++) {
                if(j == 10)
                    break outer; // exit both loops
                System.out.print(j + " ");
            }
            System.out.println("This will not print");
        }
        System.out.println("Loops complete.");
    }

    public static void main(String args[]) {
//        break1();
        break2();
    }
}
